import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class code1 {
//    力扣 150 合并区间
public int[][] merge(int[][] intervals) {
    // 可以先针对左边界进行排序操作
    // 这样就可以的到非常统一的一侧数据
    // 针对这些单一的一侧数据，可以在通过对右侧数据的比较后来获取到合适的范围

    // 先排除一下数组为 null 的情况
    if(intervals.length == 0) {
        return new int[0][2];
    }

    // 这里调用排序方法，对这里的数据进行排序操作
    // 这里涉及到了两个参数
    // 第一个参数为 intervals 表示的这个数组的名称
    // 第二个参数则是重写了 compartor 比较器 (在这里比较的是数组中的第一个元素的大小)
    Arrays.sort(intervals, new Comparator<int[]>() {
        public int compare(int[] vals1, int[] vlas2){
            // 比较的数组内部元素的左侧值
            return vals1[0] - vlas2[0];
        }
    });

    // 这里定义一个顺序表，将排列合成后的参数从新组装起来
    List<int[]> re = new ArrayList<>();

    // 通过 for 循环遍历当前数组
    for(int i = 0; i < intervals.length; i++) {
        // 首先定义两个参数记录下当前位置上的左右两个值
        int left = intervals[i][0];
        int right = intervals[i][1];
        // 此时需要设计出一个判断条件来判断添加到返回的顺序表
        // 如果表为空则直接添加
        // 如果表中的值出现了 右侧值 < 当前的 左侧值 此时就需要更新当前的返回链表
        if(re.size() == 0 || re.get(re.size() - 1)[1] < left) {
            // 将当前新的左右边界值存储到链表中
            re.add(new int[] {left, right});
        } else {
            // 这里要实现的则是一般情况下对于已经存储进去的参数的右边界值的更新
            re.get(re.size() - 1)[1] = Math.max(re.get(re.size()-1)[1], right);
        }
    }

    // 循环完成后，这里将链表中的参数进行调整，设置为符合条件的返回值
    int[][] ret = re.toArray(new int[re.size()][]);
    return ret;
}
}
